package tech.horgee.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import tech.horgee.entity.OperLog;
import tech.horgee.entity.User;
import tech.horgee.log.events.OperLogEvent;
import tech.horgee.mapper.OperLogMapper;
import tech.horgee.utils.AssertUtil;
import tech.horgee.utils.AuthUtils;

import java.util.Optional;
import java.util.Set;

/**
 * 操作日志 服务类
 *
 * @author haojun
 * @since 2023-08-10
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class OperLogService {
    private final OperLogMapper mapper;

    /**
     * 分页查询列表
     *
     * @param page   分页对象
     * @param entity 查询实体
     * @return 所有数据
     */
    public Page<OperLog> page(Page<OperLog> page, OperLog entity) {
        return mapper.selectPage(page, Optional.ofNullable(entity).orElse(new OperLog()).wrapper());
    }

    //
//    /**
//     * 不分页查询列表
//     *
//     * @param entity 实体对象
//     * @return 查询结果
//     */
//    public List<OperLog> list(OperLog entity) {
//        return mapper.selectList(Optional.ofNullable(entity).orElse(new OperLog()).wrapper());
//    }
//
//    /**
//     * 通过主键查询单条数据
//     *
//     * @param id 主键
//     * @return 单条数据
//     */
//    public OperLog getById(Long id) {
//        return mapper.selectById(id);
//    }
//
//    /**
//     * 新增单条数据
//     *
//     * @param entity 实体对象
//     */
//    @Transactional(rollbackFor = Exception.class)
//    public void save(OperLog entity) {
//        mapper.insert(entity);
//    }
//
//    /**
//     * 修改单条数据
//     *
//     * @param entity 实体对象
//     */
//    @Transactional(rollbackFor = Exception.class)
//    public void update(OperLog entity) {
//        AssertUtil.onlyOne(mapper.updateById(entity));
//    }

    /**
     * 批量删除数据
     *
     * @param ids 主键集合
     */
    @Transactional(rollbackFor = Exception.class)
    public void deleteByIds(Set<Long> ids) {
        AssertUtil.updated(mapper.deleteBatchIds(ids));
    }

    /**
     * 清空日志
     */
    public void cleanOperLog() {
        mapper.cleanOperLog();
    }

    @Async
    @EventListener
    public void handleOperLogEvent(OperLogEvent event) {
        OperLog operLog = new OperLog();
        BeanUtils.copyProperties(event, operLog);
        User loginUser = (User) AuthUtils.getUser();
        operLog.setOperName(Optional.ofNullable(loginUser).orElse(new User()).getNickname());
        mapper.insert(operLog);
    }
}
